Skip to content

fix(security): update the central Strix dependency closure - #776

Closed
seonghobae wants to merge 3 commits into
mainfrom
fix/central-strix-security-closure
Closed

fix(security): update the central Strix dependency closure#776
seonghobae wants to merge 3 commits into
mainfrom
fix/central-strix-security-closure

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Purpose

Repair the central Strix scanner dependency closure after the hard Python Security gate identified advisory-affected releases already present on main:

  • aiohttp==3.14.1 is replaced by the reviewed fixed release 3.14.3;
  • cryptography==49.0.0 is replaced by 50.0.0;
  • the complete generated lock selects the compatible pyOpenSSL==26.4.0 transitive release.

This is a prerequisite for the focused coverage/native-fuzz boundary PR #763. The two changes remain separate so dependency lifecycle and coverage policy can be reviewed, rejected, merged, or rolled back independently.

TDD evidence

Current exact head: 08d83dd2c2e4ba3ff577c9c8e53442260b3b0ff9.

The first two commits added only the executable security-floor regression and its permanent read-only workflow. Exact head 768cc63e58ff6b2c3900585258d5e873c3755e1d failed in run 30987543342 at the expected assertion because current main still selected aiohttp==3.14.1; the hash-locked install step was consequently skipped.

The implementation commit atomically replaced the direct input and complete generated hash lock. Exact-head run 30987735072 now passes both:

  • reviewed security-floor contract;
  • real python -m pip install --require-hashes -r requirements-strix-ci-hashes.txt installation.

Scope boundary

  • no reviewer identity, credential name, workflow permission escalation, scanner behavior, or NVIDIA/OpenCode/Noema key change;
  • no vulnerability suppression or advisory ignore;
  • no unhashed installation path;
  • no unrelated action-version update;
  • changed scope is only the Strix direct dependency input, generated hash lock, permanent read-only regression workflow, contract test, doctoring, and changelog.

Security and documentation

docs/doctoring/central-strix-security-closure.md records the triggering advisory evidence, exact red/green heads, generated-lock trust boundary, scope separation, verification requirements, rollback prohibition, and APA 7 references.

Acceptance

Merge only after the exact current head passes Strix Security Closure, Python Security, Security Scan, OSV, CodeQL, Semgrep, Secret Scan, SBOM, Scorecard, central tests, CodeRabbit/OpenCode/Noema current-head review, independent approval, and every branch-protection rule.

Add a failing contract for the current vulnerable aiohttp and cryptography pins before updating the reviewed hash-locked central Strix toolchain.
@seonghobae
seonghobae marked this pull request as ready for review August 5, 2026 08:03
Add a permanent read-only exact-head workflow for the dependency security floor and hash-locked install contract. The current vulnerable base is expected to fail before the closure update.
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@seonghobae, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 33 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 2ae5e722-dd1f-4e8f-af35-59810a7c13e9

📥 Commits

Reviewing files that changed from the base of the PR and between 3f65dbe and 08d83dd.

📒 Files selected for processing (6)
  • .github/workflows/strix-security-closure.yml
  • CHANGELOG.md
  • docs/doctoring/central-strix-security-closure.md
  • requirements-strix-ci-hashes.txt
  • requirements-strix-ci.txt
  • tests/test_strix_security_closure.py

Comment @coderabbitai help to get the list of available commands.

Replace the advisory-affected aiohttp and cryptography pins with the reviewed fixed versions, install the complete generated hash lock atomically, and add changelog and APA 7 trust-boundary evidence.

Copy link
Copy Markdown
Contributor Author

@opencode-agent @cwl-noema-review @coderabbitai review

Review exact current head 08d83dd2c2e4ba3ff577c9c8e53442260b3b0ff9 only. Red evidence is preserved at 768cc63e58ff6b2c3900585258d5e873c3755e1d / run 30987543342, where the direct security-floor assertion failed on aiohttp==3.14.1. Green exact-head run 30987735072 passes the reviewed floor and a real --require-hashes installation. Verify the complete generated lock, aiohttp/cryptography/PyOpenSSL compatibility, no advisory suppression, read-only exact-head workflow, no credential or permission changes, scope separation from #763, and APA 7 doctoring. Submit a formal exact-head review or actionable findings; do not reuse prior-head evidence.

@seonghobae
seonghobae enabled auto-merge (squash) August 5, 2026 08:09
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '== HEAD =='
git rev-parse HEAD
git status --short
echo '== DIFF STAT VS BASE =='
git diff --stat "$(git merge-base HEAD origin/main)" HEAD
echo '== CHANGED FILES VS BASE =='
git diff --name-status "$(git merge-base HEAD origin/main)" HEAD

echo '== CANDIDATE FILES =='
fd -HI -t f . | rg '(requirements-strix-ci|strix.*(security|closure)|central-strix|doctoring|changelog|\.github/workflows)'

echo '== WORKFLOW / TEST / DOCUMENTATION OUTLINES =='
fd -HI -t f . | rg '(strix.*(security|closure)|central-strix|requirements-strix-ci|doctoring)' | while IFS= read -r f; do
  echo "--- $f"
  sed -n '1,260p' "$f"
done

echo '== LOCKED PACKAGE ENTRIES =='
rg -n -A12 -B2 '^(aiohttp|cryptography|pyOpenSSL)==|aiohttp==|cryptography==|pyOpenSSL==' -g '*requirements*' -g '*.txt' .

echo '== ADVISORY SUPPRESSION / IGNORE CONFIGURATION =='
rg -n -i -C2 '(ignore|suppress|exclude|allowlist|advisory|osv|pip-audit|safety)' \
  -g '!**/.git/**' -g '!**/node_modules/**' .

echo '== WORKFLOW PERMISSIONS AND CREDENTIAL REFERENCES =='
rg -n -C3 '^\s*permissions:|^\s*[A-Za-z_-]+:\s*(read|write|none)\s*$|secrets\.|token|credential|NVIDIA|OpenCode|Noema' \
  -g '*.yml' -g '*.yaml' .github 2>/dev/null || true

echo '== PR `#763` REFERENCES =='
rg -n -C2 '(`#763`|763|coverage|native.fuzz|native-fuzz)' \
  -g '!**/.git/**' -g '!**/node_modules/**' .

Length of output: 201885


🏁 Script executed:

#!/bin/bash
set -euo pipefail

base="$(git merge-base HEAD origin/main)"
echo "HEAD=$(git rev-parse HEAD)"
echo "BASE=$base"
echo '== CHANGED FILES =='
git diff --name-status "$base" HEAD

echo '== COMPLETE DIFF (REVIEW SCOPE) =='
git diff --no-ext-diff --unified=60 "$base" HEAD -- \
  'requirements-strix-ci.txt' \
  'requirements-strix-ci-hashes.txt' \
  '.github/workflows/*strix*' \
  'tests/*strix*' \
  'docs/doctoring/central-strix-security-closure.md' \
  'CHANGELOG*' \
  'changelog*'

echo '== PACKAGE CONSTRAINTS AND LOCK ENTRIES =='
for f in requirements-strix-ci.txt requirements-strix-ci-hashes.txt; do
  if [ -f "$f" ]; then
    echo "--- $f"
    rg -n -A8 -B2 '^(aiohttp|cryptography|pyOpenSSL)==' "$f"
  fi
done

echo '== LOCK FORMAT VALIDATION =='
python3 - <<'PY'
from pathlib import Path
import re
p = Path("requirements-strix-ci-hashes.txt")
text = p.read_text(encoding="utf-8")
entries = re.findall(r"(?m)^([A-Za-z0-9_.-]+)==([^\s\\]+)\s*\\\n((?:\s+--hash=sha256:[0-9a-f]{64}\s*\\\n?)+)", text)
print(f"parsed_hashed_entries={len(entries)}")
for name, version, hashes in entries:
    if name.lower() in {"aiohttp", "cryptography", "pyopenssl"}:
        print(f"{name}=={version} hash_count={hashes.count('--hash=sha256:')}")
print("unhashed_requirement_lines=")
for n, line in enumerate(text.splitlines(), 1):
    if re.match(r"^[A-Za-z0-9_.-]+==", line) and not re.search(r"\\\s*$", line):
        print(f"{n}:{line}")
PY

echo '== NEW SUPPRESSIONS / IGNORES IN DIFF =='
git diff --no-ext-diff --unified=8 "$base" HEAD | rg -n -i -C2 '^\+.*(ignore|suppress|exclude|allowlist|advisory|osv|pip-audit|safety)' || true

echo '== NEW CREDENTIALS / PERMISSIONS IN DIFF =='
git diff --no-ext-diff --unified=8 "$base" HEAD -- '.github/workflows/**' | \
  rg -n -C2 '^\+.*(permissions:|secrets\.|token|credential|contents:\s*write|pull-requests:\s*write|id-token:\s*write)' || true

echo '== PR METADATA AND EXACT-HEAD CHECKS =='
gh pr view 776 --repo ContextualWisdomLab/.github --json number,headRefOid,baseRefName,changedFiles,files,statusCheckRollup \
  --jq '{number,headRefOid,baseRefName,changedFiles,files:[.files[].path],checks:[.statusCheckRollup[]|{name,conclusion,status}]}'

Length of output: 72103


@seonghobae: Exact-head source review completed for 08d83dd2c2e4ba3ff577c9c8e53442260b3b0ff9.

I found no actionable source finding.

  • The direct input selects aiohttp==3.14.3 and cryptography==50.0.0.
  • The generated hash lock selects compatible pyOpenSSL==26.4.0.
  • The generated lock contains 106 hashed entries. It has no unhashed requirement entry.
  • The closure workflow checks out the exact pull request head. It uses contents: read and persist-credentials: false.
  • The workflow runs the closure contract and the real python -m pip install --require-hashes install.
  • The diff adds no advisory suppression, credential reference, or permission escalation.
  • The doctoring records the advisory evidence, lock trust boundary, #763 scope separation, rollback restriction, verification requirements, and APA 7 references.
  • closure-contract succeeded on the exact current head.

Do not merge yet. strix, pip-audit, and several CodeQL checks were still in progress when I inspected the current head. Branch protection and independent approval remain required.

⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@seonghobae
seonghobae marked this pull request as draft August 5, 2026 08:12
auto-merge was automatically disabled August 5, 2026 08:12

Pull request was converted to draft

Copy link
Copy Markdown
Contributor Author

@opencode-agent @cwl-noema-review @coderabbitai Please review exact current head 08d83dd2c2e4ba3ff577c9c8e53442260b3b0ff9. Verify the reviewed Strix security floor (aiohttp==3.14.3, cryptography==50.0.0, compatible pyOpenSSL==26.4.0), complete generated --require-hashes lock, real locked install, no advisory suppression, no reviewer/provider/credential/workflow-permission changes, strict six-file dependency-lifecycle scope, APA 7 doctoring and changelog evidence, successful same-head Strix Security Closure/Python Security/Security Scan/OSV/CodeQL/Semgrep/Secret/SBOM/Scorecard, and zero unresolved findings.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

expected='08d83dd2c2e4ba3ff577c9c8e53442260b3b0ff9'
actual="$(git rev-parse HEAD)"
base="$(git merge-base HEAD origin/main)"
printf 'expected_head=%s\nactual_head=%s\nbase=%s\n' "$expected" "$actual" "$base"

echo '== changed files vs base =='
git diff --name-status "$base" HEAD
printf 'changed_file_count='
git diff --name-only "$base" HEAD | wc -l

echo '== relevant file outlines =='
for f in \
  requirements-strix-ci.txt \
  requirements-strix-ci-hashes.txt \
  .github/workflows/strix-security-closure.yml \
  tests/test_central_strix_security_closure.py \
  docs/doctoring/central-strix-security-closure.md \
  CHANGELOG.md
do
  if [ -f "$f" ]; then
    echo "--- $f"
    case "$f" in
      *.py) ast-grep outline "$f" --items all || true ;;
      *) sed -n '1,260p' "$f" ;;
    esac
  fi
done

echo '== exact diff =='
git diff --no-ext-diff --unified=30 "$base" HEAD

echo '== lock entry validation =='
python3 - <<'PY'
from pathlib import Path
import re, sys
p = Path("requirements-strix-ci-hashes.txt")
text = p.read_text(encoding="utf-8")
names = ("aiohttp", "cryptography", "pyopenssl")
blocks = re.findall(
    r'(?ms)^([A-Za-z0-9_.-]+)==([^\s\\]+)\s*\\\n((?:\s+--hash=sha256:[0-9a-f]{64}\s*\\\n?)+)',
    text,
)
by_name = {name.lower(): (version, hashes.count("--hash=sha256:")) for name, version, hashes in blocks}
print("hashed_entry_count=", len(blocks))
for name in names:
    print(f"{name}=", by_name.get(name))
bad = []
for i, line in enumerate(text.splitlines(), 1):
    if re.match(r'^[A-Za-z0-9_.-]+==', line) and not line.rstrip().endswith("\\"):
        bad.append(f"{i}:{line}")
print("unhashed_pinned_lines=", bad)
if actual := False:
    sys.exit(1)
PY

echo '== suppression and workflow privilege changes =='
git diff --no-ext-diff --unified=8 "$base" HEAD | \
  rg -n -i -C2 '^\+.*(ignore|suppress|exclude|allowlist|advisory.*(ignore|allow)|osv.*ignore|pip-audit.*ignore|permissions:|secrets\.|token|credential|persist-credentials|contents:\s*write|pull-requests:\s*write|id-token:\s*write|reviewer|provider)' || true

echo '== PR head and check runs =='
gh pr view 776 --repo ContextualWisdomLab/.github \
  --json number,headRefOid,baseRefName,changedFiles,files,statusCheckRollup \
  --jq '{number,headRefOid,baseRefName,changedFiles,files:[.files[].path],checks:[.statusCheckRollup[]|{name,status,conclusion,detailsUrl}]}'

Length of output: 85856


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo='ContextualWisdomLab/.github'
sha='08d83dd2c2e4ba3ff577c9c8e53442260b3b0ff9'

echo '== closure test source =='
nl -ba tests/test_strix_security_closure.py

echo '== lockfile block validation =='
python3 - <<'PY'
from pathlib import Path
import re, sys

path = Path("requirements-strix-ci-hashes.txt")
lines = path.read_text(encoding="utf-8").splitlines()
starts = [(i, re.match(r"^([A-Za-z0-9_.-]+)==([^\s\\]+)\s*\\?$", line))
          for i, line in enumerate(lines) if re.match(r"^[A-Za-z0-9_.-]+==", line)]
errors = []
records = []
for index, (start, match) in enumerate(starts):
    end = starts[index + 1][0] if index + 1 < len(starts) else len(lines)
    block = lines[start:end]
    hashes = [line.strip() for line in block if re.fullmatch(r"--hash=sha256:[0-9a-f]{64}\s*\\?", line.strip())]
    records.append((match.group(1).lower(), match.group(2), len(hashes)))
    if not hashes:
        errors.append(f"no hash: {match.group(1)}=={match.group(2)}")
print(f"package_blocks={len(records)}")
print(f"blocks_without_hash={errors}")
for name in ("aiohttp", "cryptography", "pyopenssl"):
    print(name, [record for record in records if record[0] == name])
if errors:
    sys.exit(1)
PY

echo '== check runs on exact head =='
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" \
  --jq '.check_runs | map({name, status, conclusion, app: .app.slug, details_url})'

echo '== workflow runs on exact head =='
gh api "repos/$repo/actions/runs?head_sha=$sha&per_page=100" \
  --jq '.workflow_runs | map({name, status, conclusion, event, head_sha, html_url})'

echo '== requested security check summary =='
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" \
  --jq '
    .check_runs
    | map(select(.name | test("closure-contract|strix|pip-audit|dependency-review|osv|CodeQL|Semgrep|gitleaks|generate-sbom|Scorecard|scorecard"; "i")))
    | map({name,status,conclusion,details_url})'

Length of output: 2309


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo='ContextualWisdomLab/.github'
sha='08d83dd2c2e4ba3ff577c9c8e53442260b3b0ff9'

echo '== closure test source =='
cat -n tests/test_strix_security_closure.py

echo '== lockfile block validation =='
python3 - <<'PY'
from pathlib import Path
import re, sys

lines = Path("requirements-strix-ci-hashes.txt").read_text(encoding="utf-8").splitlines()
starts = [
    (i, re.match(r"^([A-Za-z0-9_.-]+)==([^\s\\]+)\s*\\?$", line))
    for i, line in enumerate(lines)
    if re.match(r"^[A-Za-z0-9_.-]+==", line)
]
errors, records = [], []
for index, (start, match) in enumerate(starts):
    end = starts[index + 1][0] if index + 1 < len(starts) else len(lines)
    hashes = [
        line.strip() for line in lines[start:end]
        if re.fullmatch(r"--hash=sha256:[0-9a-f]{64}\s*\\?", line.strip())
    ]
    records.append((match.group(1).lower(), match.group(2), len(hashes)))
    if not hashes:
        errors.append(f"{match.group(1)}=={match.group(2)}")
print(f"package_blocks={len(records)}")
print(f"blocks_without_hash={errors}")
for name in ("aiohttp", "cryptography", "pyopenssl"):
    print(f"{name}={[record for record in records if record[0] == name]}")
if errors:
    sys.exit(1)
PY

echo '== requested check summary on exact head =='
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" \
  --jq '
    .check_runs
    | map(select(.name | test("closure-contract|strix|pip-audit|dependency-review|osv|CodeQL|Semgrep|gitleaks|generate-sbom|Scorecard|scorecard"; "i")))
    | map({name,status,conclusion,app:.app.slug,details_url})'

echo '== workflow runs on exact head =='
gh api "repos/$repo/actions/runs?head_sha=$sha&per_page=100" \
  --jq '.workflow_runs | map({name,status,conclusion,event,head_sha,html_url})'

Length of output: 11590


@seonghobae: Exact-head source review completed for 08d83dd2c2e4ba3ff577c9c8e53442260b3b0ff9.

I found no actionable source finding.

  • The change has the required six-file dependency-lifecycle scope.
  • The direct input selects aiohttp==3.14.3 and cryptography==50.0.0.
  • The generated lock selects pyopenssl==26.4.0.
  • The generated lock has 106 package blocks. Every block has at least one valid SHA-256 hash.
  • The closure contract checks the reviewed versions in both the direct input and the lock.
  • The closure workflow checks out the exact pull request head.
  • The closure workflow uses contents: read and persist-credentials: false.
  • The workflow performs the real python -m pip install --require-hashes installation.
  • The diff adds no advisory suppression, reviewer change, provider change, credential reference, or permission escalation.
  • The doctoring includes advisory evidence, the generated-lock trust boundary, #763 scope separation, rollback requirements, and APA 7 references.
  • The changelog records the security closure and the permanent exact-head contract.
  • The exact-head Strix Security Closure, Python Security, Security Scan, OSV, CodeQL, Semgrep, Secret Scan, SBOM, and Scorecard workflows succeeded.

Do not merge yet. The exact-head strix check and Strix Security Scan workflow are still in_progress. This remains the only unresolved merge condition from this review.

You are interacting with an AI system.

@seonghobae
seonghobae marked this pull request as ready for review August 5, 2026 08:14
@seonghobae
seonghobae enabled auto-merge (squash) August 5, 2026 08:14

Copy link
Copy Markdown
Contributor Author

PR #776 is now Ready on exact head 08d83dd2c2e4ba3ff577c9c8e53442260b3b0ff9; every repository security and supply-chain workflow is successful and auto-merge is enabled. @opencode-agent @cwl-noema-review @coderabbitai please submit the exact-head review outcome. No predecessor-head result is acceptable.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo='ContextualWisdomLab/.github'
pr='776'
sha='08d83dd2c2e4ba3ff577c9c8e53442260b3b0ff9'

echo '== PR metadata and head =='
gh pr view "$pr" --repo "$repo" \
  --json number,state,isDraft,headRefOid,baseRefName,mergeStateStatus,reviewDecision,autoMergeRequest,changedFiles,files \
  --jq '{
    number,state,isDraft,headRefOid,baseRefName,mergeStateStatus,reviewDecision,
    autoMergeEnabled:(.autoMergeRequest != null),
    changedFiles,
    files:[.files[].path]
  }'

echo '== Exact-head check runs =='
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" --paginate \
  --jq '.check_runs[] | {
    name,status,conclusion,
    app:.app.slug,
    details_url
  }'

echo '== Exact-head workflow runs =='
gh api "repos/$repo/actions/runs?head_sha=$sha&per_page=100" --paginate \
  --jq '.workflow_runs[] | {
    name,status,conclusion,event,head_sha,html_url
  }'

echo '== Unresolved PR review threads =='
gh api graphql \
  -F owner='ContextualWisdomLab' \
  -F name='.github' \
  -F number="$pr" \
  -f query='
query($owner: String!, $name: String!, $number: Int!) {
  repository(owner: $owner, name: $name) {
    pullRequest(number: $number) {
      reviewThreads(first: 100) {
        nodes {
          isResolved
          isOutdated
          comments(first: 1) {
            nodes { author { login } body path }
          }
        }
      }
    }
  }
}' \
  --jq '.data.repository.pullRequest.reviewThreads.nodes
    | map(select(.isResolved == false))
    | map({
        outdated:.isOutdated,
        author:.comments.nodes[0].author.login,
        path:.comments.nodes[0].path,
        body:.comments.nodes[0].body
      })'

Length of output: 27834


@seonghobae: Exact-head review completed for 08d83dd2c2e4ba3ff577c9c8e53442260b3b0ff9.

I found no actionable source finding. The PR has the declared six-file dependency-lifecycle scope. No unresolved review threads exist.

The following exact-head workflows succeeded: Strix Security Closure, Python Security, Security Scan, OSV-Scanner PR, CodeQL PR, SAST Semgrep, Secret Scan, SBOM Generation, and Scorecard PR.

I cannot submit a merge-ready outcome yet. The current strix check and Strix Security Scan workflow are still in_progress on this exact head. GitHub also reports mergeStateStatus: BLOCKED and reviewDecision: REVIEW_REQUIRED.

Wait for the current Strix workflow to succeed and for the remaining required review or branch-protection condition to clear.

You are interacting with an AI system.

Copy link
Copy Markdown
Contributor Author

@opencode-agent @cwl-noema-review Please independently review exact current head 08d83dd2c2e4ba3ff577c9c8e53442260b3b0ff9 only. All repository workflow contexts visible for this head, including Strix Security Closure, Python Security, Security Scan, OSV, CodeQL, Semgrep, Secret Scan, SBOM, and Scorecard, are successful and there are no inline review threads.

Verify the reviewed security floors (aiohttp==3.14.3, cryptography==50.0.0, compatible pyOpenSSL==26.4.0), complete generated hash-lock integrity, real --require-hashes installation evidence, no advisory suppression, unchanged reviewer identities/credential scopes/workflow permissions, APA 7 doctoring, and the focused scope boundary. Submit APPROVE only if this exact head has no actionable blocker.

Copy link
Copy Markdown
Contributor Author

Closing as superseded by #759. Exact head 4d076f636b6de5043e8501e93c06ed0a8c896eb3 already contains the same reviewed Strix direct pins and generated hash lock (aiohttp==3.14.3, cryptography==50.0.0, compatible pyOpenSSL==26.4.0), plus permanent dependency-floor tests and broader OpenCode/Strix hardening. That head has successful Python Security, Security Scan, CodeQL, Semgrep, OSV, Secret Scan, SBOM, Scorecard, and OpenCode Coverage Diagnostics checks. Keeping two security-closure PRs would duplicate review and create conflicting lock ownership. No #776 commit is merged; its red/green evidence remains referenced in the issue history.

@seonghobae seonghobae closed this Aug 5, 2026
auto-merge was automatically disabled August 5, 2026 08:44

Pull request was closed

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Please review exact current head 08d83dd2c2e4ba3ff577c9c8e53442260b3b0ff9. Verify the focused Strix closure only: aiohttp 3.14.3, cryptography 50.0.0, compatible pyOpenSSL, complete hash-locked installation, permanent security-floor regression, APA 7 doctoring, and no reviewer/NVIDIA/OpenCode credential or permission change.

@opencode-agent Review the same exact head after all current-head checks are complete. Approve only with complete coverage/docstring and security evidence.

@cwl-noema-review Independently review the same exact head; do not reuse predecessor-head evidence.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo='ContextualWisdomLab/.github'
pr='776'
expected_sha='08d83dd2c2e4ba3ff577c9c8e53442260b3b0ff9'

echo '== EXACT HEAD =='
actual_sha="$(git rev-parse HEAD)"
printf 'expected=%s\nactual=%s\n' "$expected_sha" "$actual_sha"
base="$(git merge-base HEAD origin/main)"
printf 'base=%s\n' "$base"

echo '== CHANGED FILES =='
git diff --name-status "$base" HEAD
printf 'changed_file_count='
git diff --name-only "$base" HEAD | wc -l

echo '== FOCUSED DIFF =='
git diff --no-ext-diff --unified=20 "$base" HEAD -- \
  requirements-strix-ci.txt \
  requirements-strix-ci-hashes.txt \
  .github/workflows/strix-security-closure.yml \
  tests/test_strix_security_closure.py \
  docs/doctoring/central-strix-security-closure.md \
  CHANGELOG.md

echo '== RELEVANT FILE CONTENT =='
for f in \
  requirements-strix-ci.txt \
  requirements-strix-ci-hashes.txt \
  .github/workflows/strix-security-closure.yml \
  tests/test_strix_security_closure.py \
  docs/doctoring/central-strix-security-closure.md \
  CHANGELOG.md
do
  if [ -f "$f" ]; then
    echo "--- $f"
    grep -nE '^(aiohttp|cryptography|pyOpenSSL)==|pyOpenSSL|aiohttp|cryptography|require-hashes|persist-credentials|permissions:|contents:|secrets\.|NVIDIA|OpenCode|reviewer|APA|References|08d83dd2' "$f" || true
  fi
done

echo '== LOCK STRUCTURE =='
awk '
  /^[[:alnum:]_.-]+==[^[:space:]\\]+[[:space:]]*\\$/ {
    if (in_block && hash_count == 0) print "MISSING_HASH " pkg
    pkg=$1; in_block=1; hash_count=0; block_count++
    if (pkg ~ /^(aiohttp|cryptography|pyOpenSSL)==/) print "TARGET " pkg
    next
  }
  /^[[:space:]]+--hash=sha256:[0-9a-f]{64}[[:space:]]*\\?$/ {
    if (in_block) hash_count++
    next
  }
  END {
    if (in_block && hash_count == 0) print "MISSING_HASH " pkg
    print "PACKAGE_BLOCKS " block_count
  }
' requirements-strix-ci-hashes.txt
echo 'UNHASHED_PINNED_LINES'
grep -nE '^[[:alnum:]_.-]+==[^[:space:]\\]+[[:space:]]*$' requirements-strix-ci-hashes.txt || true

echo '== ADDED SUPPRESSION OR PRIVILEGE CHANGES =='
git diff --no-ext-diff --unified=5 "$base" HEAD | \
  grep -Ein -C2 '^\+.*(ignore|suppress|allowlist|exclude|advisory.*(ignore|allow)|pip-audit.*ignore|osv.*ignore|permissions:|secrets\.|token|credential|persist-credentials|contents:[[:space:]]*write|pull-requests:[[:space:]]*write|id-token:[[:space:]]*write|NVIDIA|OpenCode|reviewer)' \
  || true

echo '== PR AND EXACT-HEAD STATUS =='
gh pr view "$pr" --repo "$repo" \
  --json number,state,headRefOid,mergeStateStatus,reviewDecision,autoMergeRequest,changedFiles,files \
  --jq '{number,state,headRefOid,mergeStateStatus,reviewDecision,autoMergeEnabled:(.autoMergeRequest != null),changedFiles,files:[.files[].path]}'

echo '== SECURITY-RELATED CHECK RUNS =='
gh api "repos/$repo/commits/$expected_sha/check-runs?per_page=100" --paginate \
  --jq '.check_runs
    | map(select(.name | test("Strix|Python Security|Security Scan|OSV|CodeQL|Semgrep|Secret|SBOM|Scorecard|closure-contract"; "i")))
    | map({name,status,conclusion,app:.app.slug})'

echo '== WORKFLOW RUNS ON EXACT HEAD =='
gh api "repos/$repo/actions/runs?head_sha=$expected_sha&per_page=100" \
  --jq '.workflow_runs | map({name,status,conclusion,head_sha})'

echo '== UNRESOLVED REVIEW THREADS =='
gh api graphql \
  -F owner='ContextualWisdomLab' -F name='.github' -F number="$pr" \
  -f query='
query($owner: String!, $name: String!, $number: Int!) {
  repository(owner: $owner, name: $name) {
    pullRequest(number: $number) {
      reviewThreads(first: 100) {
        nodes {
          isResolved
          isOutdated
          comments(first: 1) { nodes { author { login } path body } }
        }
      }
    }
  }
}' \
  --jq '.data.repository.pullRequest.reviewThreads.nodes
    | map(select(.isResolved == false))
    | map({outdated:.isOutdated,author:.comments.nodes[0].author.login,path:.comments.nodes[0].path,body:.comments.nodes[0].body})'

Length of output: 62733


@seonghobae Exact-head review completed for 08d83dd2c2e4ba3ff577c9c8e53442260b3b0ff9.

I found no actionable source finding in the focused Strix closure.

  • The direct input pins aiohttp==3.14.3 and cryptography==50.0.0.
  • The generated lock pins aiohttp==3.14.3, cryptography==50.0.0, and pyopenssl==26.4.0.
  • The lock contains 106 package blocks. Static inspection found no unhashed pinned requirement lines.
  • The permanent regression checks the reviewed direct pins and lock pins. It rejects the prior vulnerable pins.
  • The closure workflow checks out the pull request head SHA. It uses contents: read and persist-credentials: false.
  • The workflow runs the regression and the real python -m pip install --require-hashes installation.
  • The diff adds no advisory suppression, reviewer or provider change, NVIDIA/OpenCode credential reference, secret reference, or permission escalation.
  • The doctoring contains the required APA 7 references. The changelog records the dependency closure.
  • The exact-head Strix Security Closure and listed security workflow runs are successful. No unresolved review threads exist.

I cannot submit a merge-ready approval. Pull request #776 is closed, GitHub reports that it is behind its base branch, and the review decision remains REVIEW_REQUIRED.

⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant